#ifndef __CAPAINDICES_NODOS_CPP_
#define __CAPAINDICES_NODOS_CPP_

/*****************************************************************************
*                     Organizaci�n de Datos - 75.06                          *
*                         C�tedra Lic. Servetto                              *
*            Facultad de Ingenier�a - Universidad de Buenos Aires            *
******************************************************************************/ 

#include "ArbolBMas.h"
#include <sstream>

using namespace std;
using namespace Comun;

namespace CapaIndices
{
	Nodo::Nodo(){
		sincronizado = false;
		OtrosAtributos = new list<Atributo>();
	}

	Nodo::Nodo(Grupo g){

		OtrosAtributos = new list<Atributo>();
		// TODO: Arreglar con una nueva implemetacion.		
		
		//Atributos = g.Atributos;
		NodoId = g.GrupoId;
		GrupoId = g.GrupoId;
		GrupoDesborde = -2;


		for (IteradorDeRegistros i = g.Registros.begin();i!=g.Registros.end(); i++)
			this->Registros.insert(this->Registros.end(),*i);
		
		//Registros = g.Registros;

		for (IteradorDeAtributos i = g.Atributos.begin();i!=g.Atributos.end(); i++)
		{
			Atributo a = *i;
			if (a.Nombre == "Cantidad")
				Contador = atoi(a.Valor.c_str());
			else if (a.Nombre == "HijoIzquierdo")
				HijoIzquierdo = atoi(a.Valor.c_str());
			else if (a.Nombre == "NodoSiguiente")
				NodoSiguiente = atoi(a.Valor.c_str());
			else if (a.Nombre == "NodoAnterior")
				NodoAnterior = atoi(a.Valor.c_str());
			else if (a.Nombre == "Tipo")
			{
				if (a.Valor == "h")
					Tipo = CapaIndices::Hoja;
				else
					Tipo = CapaIndices::Interno;
			}
			else if (a.Nombre == "GrupoDesborde")
			{
				GrupoDesborde = atoi(a.Valor.c_str());
			}
			else
			{
				this->OtrosAtributos->push_back(a);
			}

			this->Atributos.insert(this->Atributos.end(),a);
		}
	}

	void crearAtributo(Nodo* nodo,string clave, int valor){
		
		Atributo* a = new Atributo();
		stringstream ss;
		
		a->Nombre = clave;
		a->Tipo = EnteroLargo;
		ss << valor;
		ss >> a->Valor;
		nodo->Atributos.insert(nodo->Atributos.end(),*a);
	}

	void Nodo::Sincronizar(bool esDato){
		this->Atributos.clear();

		GrupoId = NodoId;		

		Atributo* a = new Atributo();
		stringstream ss;

		a->Nombre = "Cantidad";
		a->Tipo = Entero;
		ss << Contador;
		ss >> a->Valor;
		Atributos.insert(Atributos.end(),*a);

		if (!esDato)	
		{
			crearAtributo(this,"HijoIzquierdo",HijoIzquierdo);

			a = new Atributo();
			a->Nombre = "Tipo";
			a->Tipo = Caracter;

			switch(Tipo){
			case CapaIndices::Hoja:
				a->Valor = "h";		
				break;
			case CapaIndices::Interno:
				a->Valor = "i";
				break;
			}

			Atributos.insert(Atributos.end(),*a);	
		}
		else
		{
			crearAtributo(this,"NodoAnterior",NodoAnterior);
			crearAtributo(this,"NodoSiguiente",NodoSiguiente);
			if (GrupoDesborde > -2)
				crearAtributo(this,"GrupoDesborde",GrupoDesborde);
		}

		for (IteradorDeAtributos a = OtrosAtributos->begin();a != OtrosAtributos->end(); a++)
		{
			Atributos.push_back(*a);
		}
	}


	Nodo::~Nodo(){
	}

}

#endif
